package org.kl.bf.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.lang3.StringUtils;
import org.kl.bf.entity.JavaType;
import org.springside.modules.utils.Reflections;

import com.google.common.base.Joiner;

/**
 * 类型转换器
 * 
 * @Author hqm
 * @CreateTime 2014年4月26日 下午12:50:46
 */
public class KLConvertUtils {
	static {
		registerDateConverter();
	}

	/**
	 * 提取集合中的对象的属性(通过getter函数), 组合成List.
	 * 
	 * @param collection
	 *            来源集合.
	 * @param propertyName
	 *            要提取的属性名.
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static List convertElementPropertyToList(final Collection collection, final String propertyName) {
		List list = new ArrayList();

		try {
			for (Object obj : collection) {
				list.add(PropertyUtils.getProperty(obj, propertyName));
			}
		} catch (Exception e) {
			throw Reflections.convertReflectionExceptionToUnchecked(e);
		}

		return list;
	}

	/**
	 * 提取集合中的对象的属性(通过getter函数), 组合成由分割符分隔的字符串.
	 * 
	 * @param collection
	 *            来源集合.
	 * @param propertyName
	 *            要提取的属性名.
	 * @param separator
	 *            分隔符.
	 */
	@SuppressWarnings({ "rawtypes" })
	public static String convertElementPropertyToString(final Collection collection, final String propertyName, final String separator) {
		List list = convertElementPropertyToList(collection, propertyName);
		return Joiner.on(",").join(list);
	}

	/**
	 * 转换字符串到相应类型.
	 * 
	 * @param value
	 *            待转换的字符串.
	 * @param toType
	 *            转换目标类型.
	 */
	public static Object convertStringToObject(String value, Class<?> toType) {
		try {
			if (value == null)
				return null;
			if (toType == java.sql.Date.class && value.length() > 10) {
				value = value.substring(0, 10);
			}
			if (toType == java.sql.Date.class && StringUtils.isBlank(value)) {
				return null;
			}
			return org.apache.commons.beanutils.ConvertUtils.convert(value, toType);
		} catch (Exception e) {
			throw Reflections.convertReflectionExceptionToUnchecked(e);
		}
	}

	/**
	 * 通过枚举@org.kl.bf.entity.JavaType转换为指定类型
	 * 
	 * @param value
	 * @param toType
	 * @return
	 */
	public static Object convertStringToObject(String value, String toType) {
		if (value == null)
			return null;
		if (StringUtils.equals(toType, "D") && value.length() > 10) {
			value = value.substring(0, 10);
		}
		if (StringUtils.equals(toType, "D") && StringUtils.isBlank(value)) {
			return null;
		}
		Class<?> propertyClass = null;
		try {
			propertyClass = Enum.valueOf(JavaType.class, toType).getValue();
		} catch (RuntimeException e) {
			throw new IllegalArgumentException("toType名称" + toType + "没有按规则编写,无法得到属性值类型.", e);
		}
		try {
			return org.apache.commons.beanutils.ConvertUtils.convert(value, propertyClass);
		} catch (Exception e) {
			throw Reflections.convertReflectionExceptionToUnchecked(e);
		}
	}

	/**
	 * 定义日期Converter的格式: yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
	 */
	private static void registerDateConverter() {
		DateConverter dc = new DateConverter();
		dc.setUseLocaleFormat(true);
		dc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" });
		org.apache.commons.beanutils.ConvertUtils.register(dc, Date.class);
	}

	public static void main(String[] args) {
		Date date = (Date) KLConvertUtils.convertStringToObject("2015-11-11 10:22:32", "D");
	}
}
